package com.bestcem.xm.award.dao.mapper;

import com.bestcem.xm.award.dao.mapper.query.RecordQuery;
import com.bestcem.xm.award.entity.mysql.AwardRecordEntity;
import com.bestcem.xm.award.enums.AwardIssueStatusEnum;
import com.bestcem.xm.award.service.dto.draw.AwardDetailDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 抽奖记录表Mapper
 *
 * @author hang.li <hang.li@idiaoyan.com>
 * @version v1.0
 * @date 2021/9/14 17:18
 */
@Mapper
public interface AwardRecordMapper {

    /**
     * 获取奖励已被抽奖的次数
     *
     * @param awardId 奖励id
     * @return 抽奖次数
     */
    long getAwardAlreadyDrawTotal(@Param("awardId") String awardId);

    /**
     * 根据抽奖手机号获取用户的抽奖次数
     *
     * @param awardId 奖励id
     * @param phone 抽奖手机号
     * @return 总记录数
     */
    long getDrawTotalByPhone(String awardId, String phone);

    /**
     * 根据抽奖手机号获取用户的中奖次数
     *
     * @param awardId 奖励id
     * @param phone 抽奖手机号
     * @return 总记录数
     */
    long getWinTotalByPhone(String awardId, String phone);

    /**
     * 统计各状态下的抽奖记录数
     *
     * @param awardId 奖励id
     * @param deliverId 投放id
     * @param status 抽奖状态
     * @return 抽奖记录条数
     */
    long getDrawCountByIdAndStatus(String awardId, String deliverId, Integer status);

    /**
     * 根据奖励id获取未中奖的抽奖记录数
     *
     * @param awardId 奖励id
     * @param deliverId 投放id
     * @return 未中奖的抽奖记录总数
     */
    long getNoWinCountById(String awardId, String deliverId);

    /**
     * 新增抽奖记录
     *
     * @param record AwardRecordEntity
     * @return 新增条数
     */
    int insertDrawRecord(AwardRecordEntity record);

    /**
     * 根据中奖记录id批量修改中奖状态
     *
     * @param recordIds 抽奖记录id-list
     * @param winStatus 中奖状态 {@link AwardIssueStatusEnum}
     * @param updateTime 修改时间
     * @return 修改数据行数
     */
    long updateWinStatusById(List<String> recordIds, Integer winStatus, Date updateTime);

    /**
     * 中奖人信息存入抽奖记录
     *
     * @param record AwardRecordEntity
     * @return 修改行数
     */
    int updateWinnerMessage(AwardRecordEntity record);

    /**
     * 中奖信息存入抽奖记录
     *
     * @param record AwardRecordEntity
     * @return 修改行数
     */
    int updateRecordWinByAwardPage(AwardRecordEntity record);

    /**
     * 根据页面唯一标识修改抽奖状态
     *
     * @param awardPage 页面标识
     * @param newStatus 要修改的状态
     * @param oldStatus 抽奖状态
     * @param updateTime 修改时间
     * @return 修改行数
     */
    int updateStatusByAwardPage(String awardPage, Integer newStatus, Integer oldStatus, Date updateTime);

    /**
     * 根据查询条件获取抽奖记录数
     *
     * @param query RecordQuery
     * @return 抽奖记录数
     */
    long getRecordTotal(RecordQuery query);

    /**
     * 分页查询抽奖记录
     *
     * @param query RecordQuery
     * @return 抽奖记录List
     */
    List<AwardRecordEntity> findRecordList(RecordQuery query);

    /**
     * 获取奖项信息数据条数
     *
     * @param query RecordQuery
     * @param levelList 手动上传兑奖码奖项等级List
     * @return 奖项信息数据条数
     */
    long getRecordDetailTotal(RecordQuery query, List<Integer> levelList);

    /**
     * 分页查询中奖名单奖项信息
     *
     * @param query RecordQuery
     * @param levelList 手动上传兑奖码奖项等级List
     * @return 抽奖记录List
     */
    List<AwardRecordEntity> findRecordDetailList(RecordQuery query, List<Integer> levelList);

    /**
     * 根据条件查询单条记录
     *
     * @param query RecordQuery
     * @return AwardRecordEntity
     */
    AwardRecordEntity findOneByQueryParam(RecordQuery query);

    /**
     * 统计各奖项的中奖情况
     *
     * @param awardId 奖励id
     * @param deliverId 投放id
     * @param status 抽奖状态
     * @return 聚合结果
     */
    List<AwardDetailDTO> getDrawDetail(String awardId, String deliverId, Integer status);
}